//import lombok.extern.slf4j.Slf4j;
//import org.slf4j.MDC;
//import org.springframework.stereotype.Service;
//import org.springframework.util.CollectionUtils;
//import org.springframework.util.StopWatch;
//
//import java.util.List;
//import java.util.Map;
//import java.util.Set;
//import java.util.function.Consumer;
//import java.util.function.Function;
//
///**
// * 批量修复数据用Service
// * @author zhangweilin
// * @date 2023/5/16 9:08
// * @Description:
// */
//@Slf4j
//@Service
//public class BatchRepairDataService<T extends LongBaseEntity> {
//
//	/**
//	 * 当前的补发mq的任务状态, 0表示未执行，1表示正在执行
//	 */
//	private transient int repairState = 0;
//
//	public void doRepairData(DataOpsRepairDataRo<?> ro, String title, Integer defaultBatchSize,
//			Function<DataOpsRepairDataRo<?>, List<T>> function, Consumer<util.OpsRepairDataBo<?, T>> consumer,
//			PrintLog<String, Integer, List<T>> printLog) {
//		checkParam(ro);
//		//如果当前还没跑完，需要等待跑完后才能继续触发
//		if (repairState != 0) {
//			throw new RuntimeException("当前有修补任务正在执行中，请确保当前任务执行完成后再重新触发");
//		}
//		repairState = 0;
//		Map<String, String> loginParams = util.DataOpsRepairDataRo.LoginParamsUtils.getLoginParams();
//		//todo 后续需要有比较全的线程池工具类
//		new Thread(() -> {
//			try {
//				util.DataOpsRepairDataRo.LoginParamsUtils.putAllLoginParams(loginParams);
//				MDC.put("title", title);
//				repairState = 1;
//
//				Long id = 0L;
//				List<T> dataList;
//				int pageNo = 0;
//				int totalSuccessSize = 0;
//
//				StopWatch stopwatch = new StopWatch();
//
//				do {
//					Long intervalMs = ro.getIntervalMs();
//					intervalMs = intervalMs == null ? 1000L : intervalMs;
//					try {
//						Thread.sleep(intervalMs);
//					} catch (InterruptedException e) {
//						LogUtil.error(log, "修复数据时，连休眠都异常了", e);
//					}
//					pageNo++;
//					if (!stopwatch.isRunning()) {
//						stopwatch.start(title + ",第" + pageNo + "页");
//					}
//
//					log.info("{} 开始,当前第【{}】页,入参【{}】", title, pageNo, ro);
//					DataOpsRepairDataRo<?> repairDataRo = getActivityProductSkuSnParamModel(ro, defaultBatchSize, id);
//
//					dataList = function.apply(repairDataRo);
//					printLog.accept(title, pageNo, dataList);
//					if (CollectionUtils.isNotEmpty(dataList)) {
//						//干活
//						util.OpsRepairDataBo<Object, T> repairDataBo = new util.OpsRepairDataBo<>();
//						repairDataBo.setVendorIdSet(ro.getParam1IdSet());
//						repairDataBo.setDataList(dataList);
//						repairDataBo.setParamData(repairDataRo.getData());
//						try {
//							consumer.accept(repairDataBo);
//						} catch (Throwable e) {
//							LogUtil.error(log, e, "{}，当前第【{}】页，出现异常,当前页参数:{}", title, pageNo, repairDataBo);
//						}
//						id = dataList.get(dataList.size() - 1).getId();
//						int successSize = dataList.size();
//						totalSuccessSize += successSize;
//						stopwatch.stop();
//						log.info("{}，当前第【{}】页，当前最大id:【{}】, 成功发出【{}】条,本页耗时【{}】ms,入参【{}】", title, pageNo, id, successSize,
//								stopwatch.getLastTaskTimeMillis(), ro);
//					}
//				} while (CollectionUtils.isNotEmpty(dataList));
//				double seconds = stopwatch.getTotalTimeSeconds();
//				log.info("{}，执行完毕，共刷新【{}】页，共成功【{}】条，共耗时【{}】秒,入参【{}】", title, pageNo, totalSuccessSize, seconds, ro);
//			} catch (Exception e) {
//				LogUtil.error(log, e, "{}，出现异常", title);
//			} finally {
//				log.info("{},释放锁", title);
//				util.DataOpsRepairDataRo.LoginParamsUtils.clearLoginParams();
//				repairState = 0;
//			}
//		}).start();
//	}
//
//
//	private static DataOpsRepairDataRo getActivityProductSkuSnParamModel(DataOpsRepairDataRo ro,
//			Integer defaultBatchSize, Long id) {
//		Integer batchSize1 = ro.getBatchSize();
//		if (batchSize1 == null || batchSize1 == 0 || batchSize1 > defaultBatchSize) {
//			ro.setBatchSize(defaultBatchSize);
//		}
//		ro.setId(id);
//		return ro;
//	}
//
//	private static void checkParam(DataOpsRepairDataRo ro) {
//
//	}
//
//	@FunctionalInterface
//	public interface PrintLog<T, U, V> {
//		void accept(T t, U u, V v);
//	}
//
//}
